//package com.ctrip.corp.obt.shard.aop.request;
//
//
//import com.alibaba.fastjson.JSONObject;
//import com.ctrip.corp.obt.shard.infrastructure.client.CommonApollo;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.beans.factory.annotation.Qualifier;
//import org.springframework.core.annotation.Order;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//import java.util.Objects;
//import java.util.stream.Collectors;
//
//@Aspect
//@Component
//@Slf4j
//@Order(-1)
//public class ExternalCallDataSourceAspect {
//
//    @Autowired
//    @Qualifier(value = "commonApollo")
//    private CommonApollo commonApollo;
//
//    @Pointcut("@annotation(com.corpgovernment.common.annotation.ExternalCallGetTenant)" )
//    public void addAdvice(){}
//
//
//    @Around("addAdvice()")
//    public Object Interceptor(ProceedingJoinPoint pjp) {
//        String tenantId = "";
//        try {
//            TenantContextHolder.setTenantId(CommonConst.DEFAULT_TENANT_ID);
//            tenantId = getTenantId(JSONObject.parseObject(getRequestParam(pjp)), commonApollo.getTenantAndCorpRelation());
//        } finally {
//            TenantContextHolder.clearTenantId();
//        }
//
//        String methodName = pjp.getSignature().getName();
//        Object result = null;
//        try {
//            TenantContextHolder.setTenantId(tenantId);
//            verifyTenantId(tenantId);
//            result = pjp.proceed();
//            log.info("请求" + methodName + ",返回结果为：" + result);
//        } catch (Throwable e) {
//            log.error("请求" + methodName + ",异常为", e);
//        } finally {
//            TenantContextHolder.clearTenantId();
//        }
//        return result;
//    }
//
//    private void verifyTenantId(String tenantId) {
//        String systemModel = commonApollo.getSystemModel();
//        boolean isTenant = TenantUtils.isTenant();
//        log.info("当前系统模式：{}，请求租户id：{}，是否为租户请求：{}", systemModel, tenantId, isTenant);
//        // 租户标识
//        if (Objects.equals(systemModel, CommonConst.DEFAULT_SYSTEM_MODEL)) {
//            if (isTenant) {
//                log.info("单用户系统，无法接收租户id：[{}]的请求", tenantId);
//                throw new CorpBusinessException(ExceptionCodeEnum.Alert, String.format(CommonConst.SINGLE_SYSTEM_ERROR, tenantId));
//            }
//        } else {
//            if (!isTenant) {
//                log.info("多租户系统，无法接收请求头没有租户id的请求");
//                throw new CorpBusinessException(ExceptionCodeEnum.Alert, CommonConst.MULTI_SYSTEM_ERROR);
//            }
//        }
//    }
//
//    /**
//     *
//     * @描述：获取租户ID
//     * @时间：2022年01月15日 下午17:20:21
//     * @param parseObject
//     * @param tenantAndCorpRelation
//     * @return
//     */
//    private String getTenantId(JSONObject parseObject, Map<String, List<String>> tenantAndCorpRelation) {
//        String corpId = Objects.isNull(parseObject.get("corpId")) ? null : parseObject.get("corpId").toString();
//
//        if (StringUtil.isBlank(corpId)) {
//            return Objects.isNull(parseObject.get("authKey")) ? null : parseObject.get("authKey").toString();
//        }
//
//        Iterator<Map.Entry<String, List<String>>> iterator = tenantAndCorpRelation.entrySet().iterator();
//
//        while (iterator.hasNext()) {
//            Map.Entry<String, List<String>> next = iterator.next();
//            if (!CollectionUtils.isEmpty(next.getValue().stream().filter(a -> Objects.equals(corpId, a)).collect(Collectors.toList()))) {
//                return next.getKey();
//            }
//        }
//
//        return null;
//    }
//
//
//    /**
//     *
//     * @描述：获取请求参数
//     * @时间：2022年01月15日 下午17:20:21
//     * @param joinPoint
//     * @return
//     */
//    private String getRequestParam(JoinPoint joinPoint) {
//        Object[] args = joinPoint.getArgs();
//        String body = new String();
//        for (Object arg : args) {
//            body = JSONObject.toJSONString(arg);
//        }
//        return body;
//    }
//}
